package com.springbooti18n.config;

import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.hibernate.validator.resourceloading.PlatformResourceBundleLocator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

import javax.validation.Validator;

//import org.springframework.validation.Validator;

/**
 * xufan
 * 2019/1/4
 * 参考资料https://www.ibm.com/developerworks/cn/java/j-cn-hibernate-validator/index.html
 */
@Configuration
@ConditionalOnClass(InternationalConfig.class)
public class ValidationConfig  {

//    @Resource
//    MessageSource messageSource;

    @Value(value = "${spring.messages.validata}")
    private String basename ;
    @Bean
    public Validator getValidator() {
//        RequestContext.getValidator
//        设置校验器的资源路径 如果使用公用的messageSource 重名的话有可能存在显示错乱
//        例如：A文件中定义XXX B文件中也定义了XXX那就悲剧了，看缓存了
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
//        messageSource.addBasenames(basename);
        messageSource.setBasename(basename);
//        源码中发现需要定义文件名字，然后在根据当前语言环境去拼接查找
//        这就是为什么多语言环境是 文件名_语言命名结构
//        校验过程需要EL表达式以及配置文件加载到内存，一个一个比较可能比较耗时间
//        内容保存在 显示文本保存在hibernate的弱应用的MAP中，随时可被回收，便于提高内存利用率
        PlatformResourceBundleLocator Locator =
                new PlatformResourceBundleLocator("message" );
        ResourceBundleMessageInterpolator messageInterpolator =
                new ResourceBundleMessageInterpolator(Locator);
//        messageSource.messageSource
//        从Bean工厂拿到当前的 validator
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource);
//        validator.setMessageInterpolator(messageInterpolator);

//        设置校验器的语言选项

//        PlatformResourceBundleLocator  locator =
//           new PlatformResourceBundleLocator("messages" );
//        Validator validator = Validation.byDefaultProvider()
//                .configure()
//                .messageInterpolator(
//                        new ResourceBundleMessageInterpolator(
//                                new PlatformResourceBundleLocator("messages" )))
//                .buildValidatorFactory()
//                .getValidator();
        return validator;
    }



}
